package com.hyy.advice;


import com.hyy.common.exception.BlogException;
import com.hyy.common.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * 全局异常处理器
 * 使用AOP思想，集中处理系统中的各类异常，统一异常响应格式
 */
@Slf4j
@RestControllerAdvice
public class ExceptionAdvice {
    /**
     * 处理一般性异常
     * 捕获所有未被特定处理器处理的异常
     * @param e 捕获的异常
     * @return 统一的错误响应
     */
    @ExceptionHandler
    public Result handler(Exception e){
        log.error("发生异常, e: {}", e);
        return Result.fail(e.getMessage());
    }

    /**
     * 处理业务异常
     * 专门处理自定义的BlogException异常
     * @param e 业务异常
     * @return 统一的错误响应
     */
    @ExceptionHandler
    public Result handler(BlogException e){
        log.error("发生异常, e: {}", e);
        return Result.fail(e.getMessage());
    }

    /**
     * 处理参数校验异常
     * 当请求参数不符合校验规则时触发
     * @param e 参数校验异常
     * @return 统一的错误响应，并设置HTTP状态码为400
     */
    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    @ExceptionHandler({ MethodArgumentNotValidException.class})
    public Result verifyHandle(Exception e){
        log.error("参数校验失败: {}", e.getMessage());
        return Result.fail(e.getMessage());
    }
}
